import os
import subprocess
import argparse
from pathlib import Path

def get_default_branch(repo_path, remote='origin'):
    """获取远程仓库的默认分支名称"""
    try:
        # 尝试获取远程仓库信息
        result = subprocess.run(
            ['git', 'remote', 'show', remote],
            capture_output=True,
            text=True,
            check=True,
            cwd=repo_path
        )
        
        # 从输出中提取默认分支名称
        for line in result.stdout.splitlines():
            line = line.strip()
            if line.startswith("HEAD branch:"):
                return line.split(":")[1].strip()
        
        # 如果无法确定，默认返回 main
        print("警告: 无法确定远程默认分支，使用 'main' 作为默认值")
        return 'main'
    
    except subprocess.CalledProcessError:
        print("警告: 获取远程分支信息失败，使用 'main' 作为默认值")
        return 'main'

def git_sync(repo_path, remote='origin'):
    """
    从Git远程仓库同步项目，放弃本地所有修改
    
    参数:
    repo_path (str): 本地仓库路径
    remote (str): 远程仓库名称，默认为'origin'
    """
    # 检查路径是否存在
    if not os.path.exists(repo_path):
        print(f"错误：路径 '{repo_path}' 不存在")
        return False
    
    # 检查路径是否为Git仓库
    git_dir = os.path.join(repo_path, '.git')
    if not os.path.exists(git_dir):
        print(f"错误：路径 '{repo_path}' 不是一个Git仓库")
        return False
    
    print(f"开始同步仓库: {repo_path}")
    
    try:
        # 切换到仓库目录
        original_dir = os.getcwd()
        os.chdir(repo_path)
        
        # 获取远程默认分支
        branch = get_default_branch(repo_path, remote)
        print(f"检测到远程默认分支: {branch}")
        
        # 放弃本地所有修改
        print("正在放弃本地所有修改...")
        subprocess.run(['git', 'reset', '--hard'], check=True)
        subprocess.run(['git', 'clean', '-fdx'], check=True)
        
        # 确保本地分支与远程分支同步
        subprocess.run(['git', 'checkout', branch], check=True)
        
        # 拉取最新代码
        print(f"正在从 {remote}/{branch} 拉取最新代码...")
        subprocess.run(['git', 'pull', remote, branch], check=True)
        
        print("\n✅ 已成功和云端同步!")
        return True
        
    except subprocess.CalledProcessError as e:
        print(f"Git命令执行失败: {e}")
        return False
    except Exception as e:
        print(f"发生未知错误: {e}")
        return False
    finally:
        # 回到原来的目录
        if 'original_dir' in locals():
            os.chdir(original_dir)

def main():
    # 获取脚本所在目录作为默认仓库路径
    repo_path = os.path.dirname(os.path.abspath(__file__))
    
    parser = argparse.ArgumentParser(description='Git项目一键同步工具')
    parser.add_argument('--path', default=repo_path, help='本地仓库路径 (默认: 脚本所在目录)')
    parser.add_argument('--remote', default='origin', help='远程仓库名称 (默认: origin)')
    
    args = parser.parse_args()
    
    # 规范化路径
    repo_path = os.path.abspath(os.path.expanduser(args.path))
    
    # 执行同步
    success = git_sync(repo_path, args.remote)
    
    # 根据执行结果设置退出码
    exit(0 if success else 1)

if __name__ == "__main__":
    main()    